package sv.com.seguros.dso.sgd;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import sv.com.seguros.dso.BaseServiceImpl;
import sv.com.seguros.dto.sgd.SgdAcceso;
import sv.com.seguros.dto.sgd.SgdUsuario;
import sv.com.seguros.exception.WebException;
import sv.com.seguros.web.util.DBContext;
import sv.com.seguros.web.util.WebUtilidades;

public class SgdUsuarioServiceImpl extends BaseServiceImpl implements SgdUsuarioService{
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void saveOrUpdateSgdUsuario(SgdUsuario sgdUsuario, List<SgdAcceso> sgdAccesos) throws WebException{
		try {
			boolean updateRegister = sgdUsuario.getSgdUsuarioId() != null && sgdUsuario.getSgdUsuarioId() > 0;
			if(updateRegister) update(sgdUsuario);
			else save(sgdUsuario);
			if(StringUtils.isNotBlank(sgdUsuario.getSgdUsuarioClave())){
				String hqlQuery = "update SgdUsuario set sgdUsuarioClave = :sgdUsuarioClave where sgdUsuarioId = :sgdUsuarioId";
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("sgdUsuarioId", sgdUsuario.getSgdUsuarioId());
				parameters.put("sgdUsuarioClave", WebUtilidades.getHashedString(sgdUsuario.getSgdUsuarioClave(), 
						StringUtils.upperCase(sgdUsuario.getSgdUsuarioUsuario())));
				executeNonHibernateQuery(hqlQuery, parameters);
			}
			boolean atLeastOne = false;
			if(!WebUtilidades.isEmptyList(sgdAccesos)){
				for (SgdAcceso sgdAcceso: sgdAccesos) {
					if("1".equals(sgdAcceso.getSgdAccesoAsignado()) || "true".equalsIgnoreCase(sgdAcceso.getSgdAccesoAsignado())){
						save(sgdAcceso);
						atLeastOne = true;
					}
					else if(sgdAcceso.getSgdAccesoId() != null && sgdAcceso.getSgdAccesoId() > 0){
						delete(sgdAcceso);
					}
				}
			}
			if(!updateRegister && !atLeastOne){
				SgdAcceso sgdAcceso = new SgdAcceso();
				sgdAcceso.setSgdUsuario(sgdUsuario);
				sgdAcceso.setSgdRol(DBContext.getCtgCatalogoDao().findByCodigo(WebUtilidades.SGD_ROLE_USUARIO_CODIGO));
				save(sgdAcceso);
			}
		} catch (WebException e) {
			throw e;
		} catch (Exception e) {
			throw new WebException("Problemas al intentar guardar la informaci\u00F3n del usuario");
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteSgdUsuario(Long sgdUsuarioId) throws WebException{
		try{
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.put("sgdUsuarioId", sgdUsuarioId);
			String hqlQuery = "delete from SgdAcceso where sgdUsuario.sgdUsuarioId = :sgdUsuarioId";
			executeNonHibernateQuery(hqlQuery, parameters);
			hqlQuery = "delete from SgdUsuario where sgdUsuarioId = :sgdUsuarioId";
			executeNonHibernateQuery(hqlQuery, parameters);
		}catch(Exception e){
			throw new WebException("Problemas al tratar de eliminar el registro <br />Registro puede estar asociado a un Cliente, Poliza, etc");
		}
	}

}
